#include <fstream>
#include <sstream>
#include <iomanip>
#include "Compras.h"

Compras::Compras()
{
}

Compras::~Compras()
{
}

istream &operator>>(istream &is, Pedido &ped)
{
	string campo, linha;
	int tmp;
	double aux;
	size_t pos, pos_a = 0;
	getline(is, linha);
// Codigo
	pos = linha.find(';');
	campo = linha.substr(pos_a,pos);
	stringstream cd;
	cd << campo ;
	cd >> tmp;
	ped.SetCodigo(tmp);
// Valor do Pedido
	pos_a = pos;
	pos = linha.find(";", pos_a+1);
	campo = linha.substr(pos_a+1,pos-pos_a-1);
	stringstream valorped;
	valorped << campo;
	valorped >> aux;
	ped.SetValorPedido(aux);
//Status	
	pos_a = pos;
	pos = linha.find(";", pos_a+1);
	campo = linha.substr(pos_a+1,pos-pos_a-1);
	stringstream status;
	status << campo;
	status >> tmp;
	ped.SetStatus(tmp);
	return is;	
}

ostream &operator<<(ostream &os, const Pedido &ped)
{
	os << "\t| " << setw(10) << ped.GetCodigo() 
	    << " | R$" << setw(10) << fixed << setprecision(2) << ped.GetValorPedido() << " |";
	return os;	
}

void Compras::CarregaPedidos(string NomeArquivo)
{
	try 
	{
		fstream arq(NomeArquivo.c_str(), fstream::in);
		string str;
		Pedido ped;
		getline(arq, str); // pular a primeira linha!!!!
		while(! arq.eof() )
		{
			arq >> ped;
			Pedidos.Insere(ped);		
		}		
	} 
	catch (ExcecaoVetor e) 
	{
		cerr << endl << "Erro no vetor Pedidos: " << e.what();
	}
	catch (runtime_error e)
	{
		cerr << endl << "Erro: " << e.what();	
	}		
}

void Compras::ApresentaPedidos()
{
	cout << endl << "\t    -- Lista de Pedidos --" << endl;
//linha superior
	cout << "\t|" << setw(28) << setfill('-') << "|" << setfill(' ');	
//Cabecalho
	cout << endl;
	cout << "\t| " << setw(10) << left << "Conta no." 
	      << " | " << setw(12)<< left << "Valor Pedido" << " |";	      
//linha do meio
	cout << endl << "\t|" << right << setw(28) << setfill('-') << "|" << setfill(' ') << endl;
//Dados	
	for(int i = 0; 	i < Pedidos.GetNumValores(); i++)
		if(Pedidos[i].GetValorPedido()!= 0)
			cout << Pedidos[i] << endl;			
//linha inferior
	cout << "\t|" << right << setw(28) << setfill('-') << "|" << setfill(' ') << endl;
}

void Compras::SetStatus(int pos, int aut)
{
	Pedidos[pos].SetStatus(aut);	
}

int Compras::GetNumPedidos()
{
	return Pedidos.GetNumValores();
}

double Compras::GetValorPedido(int i)
{
	return Pedidos[i].GetValorPedido();
}

int Compras::GetCodigo(int pos)
{
	return Pedidos[pos].GetCodigo();
}

Pedido Compras::GetPedido(int i)
{
	return Pedidos[i];	
}

void Compras::LimparPedidos()
{
	for(int i = 0; 	i < Pedidos.GetNumValores() ; i++)
		if( Pedidos[i].GetStatus() != 0 )
		{
			Pedidos[i].SetCodigo(0);
			Pedidos[i].SetValorPedido(0);
			Pedidos[i].SetStatus(0);
		}	
}
